MySQL 3306 端口不通的分层排查
复核日期:2026-10-16。不要一开始就把
bind-address改成0.0.0.0;先确认业务来源网段,再按最小暴露原则放行。
1. 先区分错误类型
Connection refused:目标主机可达,但端口未监听、被本机策略拒绝或服务未启动。Connection timed out:路由、云安全组、防火墙或 ACL 可能丢弃了流量。Access denied:网络已经通,问题在用户、来源地址、密码或权限。- TLS/握手报错:检查客户端版本、证书和 MySQL 的加密要求。
2. 服务端检查
systemctl status mysqld --no-pager
ss -lntp | grep ':3306'
mysql -NBe "SHOW VARIABLES LIKE 'port'; SHOW VARIABLES LIKE 'bind_address';"
如果只监听 127.0.0.1:3306,远程客户端无法连接。根据实际需求绑定服务器内网地址,或使用 MySQL 支持的适当监听配置。配置文件常见位置为 /etc/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf,以当前发行版为准。
[mysqld]
bind-address = 10.1.105.12
修改前先备份配置并验证语法,重启后再次用 ss 检查。官方变量说明:MySQL bind_address
3. 网络路径检查
从客户端执行:
ping 10.1.105.12
nc -vz -w 3 10.1.105.12 3306
traceroute 10.1.105.12
Ping 成功不代表 TCP 3306 一定可达。逐层核对主机防火墙、云安全组、VPC/NAT、机房 ACL 和负载均衡健康状态,只允许业务服务器网段访问,禁止把数据库端口直接暴露到公网。
4. 用户与授权检查
SELECT user, host, account_locked FROM mysql.user ORDER BY user, host;
SHOW GRANTS FOR 'appuser'@'10.1.105.%';
MySQL 账号由“用户名 + 来源 Host”共同确定。不要为了省事创建来源为 % 且权限过大的账号;应用账号应限制来源、库表权限并使用独立强密码。
5. 抓取关键日志
journalctl -u mysqld --since '-30 min' --no-pager
tail -n 200 /var/log/mysqld.log
日志路径随发行版和配置而异。若使用容器,还要检查端口映射、容器网络和服务发现。
验证清单
- 客户端到目标 IP 的 3306 TCP 连通。
- 服务只监听需要的地址,不暴露到无关网络。
- 指定账号能连接且仅拥有所需权限。
- 应用连接池恢复,服务端没有持续认证失败或 TLS 告警。
- 记录变更内容、执行人、验证结果和回滚方式。